//
//  GYXStatusViewModel.swift
//  GYXWeibo
//
//  Created by Twisal on 2017/3/9.
//  Copyright © 2017年 Twisal. All rights reserved.
//

import Foundation


/// 单条微博的视图模型,负责单条微博的业务逻辑
/**
 如果没有任何父类，如果希望在开发时调试，输出调试信息，需要
 1. 遵守 CustomStringConvertible
 2. 实现 description 计算型属性
 
 关于表格的性能优化
 
 - 尽量少计算，所有需要的素材提前计算好！
 - 控件上不要设置圆角半径，所有图像渲染的属性，都要注意！
 - 不要动态创建控件，所有需要的控件，都要提前创建好，在显示的时候，根据数据隐藏／显示！
 - Cell 中控件的层次越少越好，数量越少越好！
 - 要测量，不要猜测！
 */
class GYXStatusViewModel: CustomStringConvertible {
    /// 微博模型
    var status: GYXStatus
    /// 会员等级图标
    var memberIcon: UIImage?
    /// 认证图标
    var verifiedIcon: UIImage?
    /// 转发文字
    var retweetedStr: String?
    /// 评论文字
    var commentStr: String?
    /// 点赞文字
    var likeStr: String?
    
    /// 图片模型数组
    var picUrls: [GYXStatusPicture]? {
        // 如果转发微博有值就使用转发微博的图片, 如果没有就使用原创微博的图片
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }
    /// 微博文本
    var statusAttributeText: NSAttributedString?
    /// 转发微博的文字
    var retweetedAttributeText: NSAttributedString?
    
    /// 配图视图的尺寸
    var pictureViewSize = CGSize()
    
    /// cell行高
    var rowHeight: CGFloat = 0
    
    /// 通过'模型'来创建'视图模型'
    ///
    /// - Parameter model: 传入的模型
    init(model: GYXStatus) {
        self.status = model
        // 设置会员等级图标
        let userMbrank = model.user?.mbrank ?? -1
        if  userMbrank > 0 && userMbrank < 7 {
            let image = UIImage(named: "common_icon_membership_level\(userMbrank)")
            memberIcon = image
        }
        
        // 设置认证图标,认证类型，-1：没有认证，0，认证用户，2,3,5: 企业认证，220: 达人
        let userVerifiedType = model.user?.verified_type ?? -1
        switch userVerifiedType {
        case 0:
            verifiedIcon = UIImage(named: "avatar_vip")
        case 2,3,5:
            verifiedIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            verifiedIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }
        
//        let count = Int(arc4random_uniform(100000))
        retweetedStr = countString(count: model.reposts_count, defaultStr: "转发")
        commentStr = countString(count: model.comments_count, defaultStr: "评论")
        likeStr = countString(count: model.attitudes_count, defaultStr: "赞")
        pictureViewSize = calPictureViewSize(count: picUrls?.count)
        let originFont = UIFont.systemFont(ofSize: 15)
        let retweetedFont = UIFont.systemFont(ofSize: 14)
        // 设置微博正文的富文本
        statusAttributeText = CZEmoticonManager.shared.emoticonString(string: model.text ?? "", font: originFont)
        // 设置转发微博的富文本
        let rText = "@" + (model.retweeted_status?.user?.screen_name ?? "") + ": " + (model.retweeted_status?.text ?? "")
        retweetedAttributeText = CZEmoticonManager.shared.emoticonString(string: rText, font: retweetedFont)
        updateRowHeight()
    }
    
    
    /// viewModel的描述属性
    var description: String {
        return status.description
    }
    
    
    /// 计算cell的行高
    private func updateRowHeight() {
        // 原创微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        // 被转发微博：顶部分隔视图(12) + 间距(12) + 图像的高度(34) + 间距(12) + 正文高度(需要计算) + 间距(12)+间距(12)+转发文本高度(需要计算) + 配图视图高度(计算) + 间距(12) ＋ 底部视图高度(35)
        let margin: CGFloat = 12
        let iconHeight: CGFloat = 34
        let toolbarHeight: CGFloat = 35
        
        var height: CGFloat = 0
        
        height = margin * 2 + iconHeight + margin
        let viewSize = CGSize(width: UIScreen.cz_screenWidth() - 2 * margin, height: CGFloat(MAXFLOAT))
        // 正文高度
        if let text = statusAttributeText {
            height += text.boundingRect(with: viewSize, options: .usesLineFragmentOrigin, context: nil).height
//            height += (text as NSString).boundingRect(with: viewSize, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil).height
        }
        
        // 转发微博的高度
        if status.retweeted_status != nil {
            height += margin * 2
            if let text = retweetedAttributeText {
                height += text.boundingRect(with: viewSize, options: .usesLineFragmentOrigin, context: nil).height
//                height += (text as NSString).boundingRect(with: viewSize, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil).height
            }
        }
        
        height += pictureViewSize.height + margin + toolbarHeight
        rowHeight = height
    }
    
    
    /// 重新计算单张图片的配图视图的大小
    ///
    /// - Parameter image: 返回的单张图片
    func updateSingleImageSize(image: UIImage) {
        // 获取图像尺寸
        var size = image.size
        // 设置最大宽度和最小宽度
        let maxWidth: CGFloat = 200
        let minWidth: CGFloat = 40
        
        // 过宽图像处理
        if size.width > maxWidth {
            // 设置最大宽度
            size.width = maxWidth
            // 等比例调整高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        // 过窄图像处理
        if size.width < minWidth {
            size.width = minWidth
            
            // 要特殊处理高度，否则高度太大，会印象用户体验
            size.height = size.width * image.size.height / image.size.width
        }
        
        // 过长图像处理
        if size.height > maxWidth {
            size.height = maxWidth
        }
        
        size.height += WBStatusPictureViewOutterMargin
        pictureViewSize = size
        updateRowHeight()
    }
    
    /// 计算配图视图的尺寸
    ///
    /// - Parameter count: 配图视图的个数
    /// - Returns: 配图视图的尺寸
    private func calPictureViewSize(count: Int?) -> CGSize {
        
        if count == 0 || count == nil {
            return CGSize()
        }
        
        // 计算高度
        // 1> 根据 count 知道行数 1 ~ 9
        /**
         1 2 3 = 0 1 2 / 3 = 0 + 1 = 1
         4 5 6 = 3 4 5 / 3 = 1 + 1 = 2
         7 8 9 = 6 7 8 / 3 = 2 + 1 = 3
         */
        let row = (count! - 1) / 3 + 1
        // 2> 计算高度
        let height = WBStatusPictureViewOutterMargin + CGFloat(row - 1) * WBStatusPictureViewInnerMargin + CGFloat(row) * WBStatusPictureItemWidth

        return CGSize(width: WBStatusPictureViewWidth, height: height)
    }
    
    /// 给定义一个数字，返回对应的描述结果
    ///
    /// - parameter count:      数字
    /// - parameter defaultStr: 默认字符串，转发／评论／赞
    ///
    /// - returns: 描述结果
    /**
     如果数量 == 0，显示默认标题
     如果数量超过 10000，显示 x.xx 万
     如果数量 < 10000，显示实际数字
     */
    private func countString(count: Int, defaultStr: String) -> String {
        if count == 0 {
            return defaultStr
        }
        
        if count < 10000 {
            return count.description
        }
        
        return String(format: "%.2f 万", Double(count)/10000)
      
    }
}
